package org.edu.modules.oa.controller;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import io.swagger.annotations.Api;

import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;

import org.apache.poi.ss.formula.functions.T;
import org.apache.shiro.SecurityUtils;
import org.edu.common.api.vo.Result;
import org.edu.common.aspect.annotation.AutoLog;

import org.edu.common.system.vo.LoginUser;
import org.edu.common.util.RedisUtil;
import org.edu.modules.oa.config.QueryConditionTool;
import org.edu.modules.oa.entity.VeOaCarInfoEntity;
import org.edu.modules.oa.entity.VeOaCarShiYongEntity;
import org.edu.modules.oa.entity.VeOaCarWeizhangShiguEntity;

import org.edu.modules.oa.mapper.IVeOaCarInfoMapper;
import org.edu.modules.oa.service.IVeOaCarInfoService;
import org.edu.modules.oa.service.IVeOaCarWeihuService;
import org.edu.modules.oa.service.IVeOaCarWeizhangShiguService;

import org.edu.modules.oa.util.OssDownloadUtil;
import org.edu.modules.oa.vo.QueryCondition;
import org.edu.modules.oa.vo.VeOaCarInfoTableVo;
import org.edu.modules.oa.vo.VeOaCarJiayouTableVo;
import org.edu.modules.oa.vo.VeOaCarWeizhangShiguVo;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;


@Api(tags="车辆违章事故记录")
@RestController
@RequestMapping("oa/veOaCarWeizhangShigu")
@Slf4j

public class VeOaCarWeizhangShiguController {

    @Resource//注入
    private IVeOaCarWeizhangShiguService iVeOaCarWeizhangShiguService;
    @Autowired
    private RedisUtil redisUtil; // redis服务类

    //日志注解
    @AutoLog(value = "车辆违章事故-显示表格")
    //(value = “接口说明”, httpMethod = “接口请求方式”, response = “接口返回参数类型”, notes = “接口发布说明”）
    @ApiOperation(value="显示表格", notes="车辆违章事故-显示表格")
    //映射一个POST请求
    @PostMapping(value = "/showWeiShiTable")
    //展示表格
    public Result<?> showTable(Integer page,Integer pageSize,VeOaCarWeizhangShiguEntity veOaCarWeizhangShiguEntity) {
        // 前端传过来的时间字符串转换成日期
//        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd");
//        Date sTime= null;
//        sTime = formatter.parse(date.trim());
//        veOaCarWeizhangShiguEntity.setWeishiDate(sTime);
        HashMap<String, Object> map = iVeOaCarWeizhangShiguService.showWeizhangShiguTable(page,pageSize,veOaCarWeizhangShiguEntity);

        return Result.OK(map);

    }

    //删除单条记录
    @RequestMapping("/deletById")
    public Result<?>deleteById(Integer id){
        int res = iVeOaCarWeizhangShiguService.deletById(id);
        if(res==0){
            //删除失败
            return Result.error(500,"删除失败");
        }
        return Result.OK("删除成功，但是你看不到我");
    }

    //删除多条记录
    @RequestMapping("/deletAll")
    public Result<?>deleteAll(String idAll) {
        if (idAll != null || idAll != "") {
            //切割逗号，转成数组
            String[] arr = idAll.split(",");
            for (int i=1;i<arr.length;i++){
                iVeOaCarWeizhangShiguService.deletById(Integer.parseInt(arr[i]));

            }

//            for (String i : arr) {
//                if (i != null || !i.equals("")) {
//                    b+=iVeOaCarWeizhangShiguService.deletById(Integer.parseInt(i));
//                }
//            }

        }
        return Result.ok();
    }
    //导出
    @AutoLog(value = "车辆加违章事故记录导出excel表格")
    @ApiOperation(value = "车辆加违章事故记录导出excel表格", notes = "车辆加违章事故记录导出excel表格")
    @RequestMapping(value = "/exportTable")
    // ModelAndView 导出表格流
    public ModelAndView exportTable() {
        VeOaCarShiYongEntity veOaCarShiYongEntity =new VeOaCarShiYongEntity();

        // 创建导出流
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        // 查数据获得维护表格的集合
        List<VeOaCarWeizhangShiguVo> list = iVeOaCarWeizhangShiguService.export(veOaCarShiYongEntity);
        // 文件的文件名
        mv.addObject(NormalExcelConstants.FILE_NAME, "车辆违章事故记录");
        // 数据的类型
        mv.addObject(NormalExcelConstants.CLASS, VeOaCarWeizhangShiguVo.class);
        // 获取redis存的用户值
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        // ExportParams  Export工具类   （参数1--》title:表格标题  参数2--》secomdTitle:第二行的标题，  参数3--》secomdTitle:最下面尾部的信息）
        ExportParams exportParams = new ExportParams("车辆违章事故记录", "导出人:" + user.getRealname(), "导出违章事故辆加油记录");
        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
        mv.addObject(NormalExcelConstants.DATA_LIST, list);
        return mv;
    }
    //单个导出
    @AutoLog(value = "车辆加违章事故记录单个导出excel表格")
    @ApiOperation(value = "车辆加违章事故记录单个导出excel表格", notes = "车辆加违章事故记录单个导出excel表格")
    @RequestMapping(value = "/exportTableOne")
    // ModelAndView 导出表格流
    public ModelAndView exportTableOne() {
        VeOaCarShiYongEntity veOaCarShiYongEntity =new VeOaCarShiYongEntity();

        VeOaCarInfoTableVo vo = (VeOaCarInfoTableVo) redisUtil.get("carInfo");

        veOaCarShiYongEntity.setCarId(vo.getId() );
        // 创建导出流
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        // 查数据获得维护表格的集合
        List<VeOaCarWeizhangShiguVo> list = iVeOaCarWeizhangShiguService.export(veOaCarShiYongEntity);
        // 文件的文件名
        mv.addObject(NormalExcelConstants.FILE_NAME, "车辆违章事故记录");
        // 数据的类型
        mv.addObject(NormalExcelConstants.CLASS, VeOaCarWeizhangShiguVo.class);
        // 获取redis存的用户值
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        // ExportParams  Export工具类   （参数1--》title:表格标题  参数2--》secomdTitle:第二行的标题，  参数3--》secomdTitle:最下面尾部的信息）
        ExportParams exportParams = new ExportParams("车辆违章事故记录", "导出人:" + user.getRealname(), "导出违章事故辆加油记录");
        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
        mv.addObject(NormalExcelConstants.DATA_LIST, list);
        return mv;
    }
    //导入
    @AutoLog(value = "车辆加违章事故记录导出excel表格")
    @ApiOperation(value = "车辆加违章事故记录导出excel表格", notes = "车辆加违章事故记录导出excel表格")
    @RequestMapping(value = "/list")
    // ModelAndView 导出表格流
    public ModelAndView exportTableTest() {
        VeOaCarShiYongEntity veOaCarShiYongEntity =new VeOaCarShiYongEntity();

        // 创建导出流
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        // 查数据获得加油表格的集合
        List<VeOaCarWeizhangShiguVo> list = iVeOaCarWeizhangShiguService.export(veOaCarShiYongEntity);
        // 文件的文件名
        mv.addObject(NormalExcelConstants.FILE_NAME, "车辆加油记录");
        // 数据的类型
        mv.addObject(NormalExcelConstants.CLASS, VeOaCarWeizhangShiguVo.class);
        // 获取redis存的用户值

        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        // ExportParams  Export工具类   （参数1--》title:表格标题  参数2--》secomdTitle:第二行的标题，  参数3--》secomdTitle:最下面尾部的信息）
        ExportParams exportParams = new ExportParams("车辆加油记录", "导出人:" + user.getRealname(), "导出车辆加油记录");
        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
        mv.addObject(NormalExcelConstants.DATA_LIST, list);
        return mv;
    }
    //获取整个车辆表
    @AutoLog(value = "车辆违章事故记录-获取车辆表")
    @ApiOperation(value = "获取整个车辆表", notes = "车辆违章事故记录-获取整个车辆表")
    @RequestMapping(value = "/showCarTable")
    public Result<?> showTable(){
        List<VeOaCarInfoEntity>list=iVeOaCarWeizhangShiguService.showCarTable();
        for (VeOaCarInfoEntity v : list){
            System.out.println(v);
        }

        return Result.OK(list);
    }

    //添加数据
    @AutoLog(value = "车辆加违章事故记录-添加数据")
    @ApiOperation(value = "车辆加违章事故记录添加数据", notes = "车辆加违章事故记录添加数据")
    @PostMapping(value = "/addCarTable")
    public Result<?>addTable(VeOaCarWeizhangShiguEntity veOaCarWeizhangShiguEntity,String date)throws ParseException {
        // 前端传过来的时间字符串转换成日期
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date sTime= null;
        sTime = formatter.parse(date.trim());
        veOaCarWeizhangShiguEntity.setWeishiDate(sTime);
        //获取登陆人的信息
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        veOaCarWeizhangShiguEntity.setCreateBy(user.getId());
        veOaCarWeizhangShiguEntity.setCreateByName(user.getRealname());
        veOaCarWeizhangShiguEntity.setTerminalId(1);//终端ID
        int res = iVeOaCarWeizhangShiguService.addWeizhangShigu(veOaCarWeizhangShiguEntity);
        if(res==0){
            return Result.error(500,"添加失败");
        }
        return Result.ok();
    }

    //导入
    @AutoLog(value = "车辆加违章事故记录-导入")
    @ApiOperation(value = "车辆加违章事故记录导入", notes = "车辆加违章事故记录导入")
    @PostMapping(value = "/importExcel")
    public Result<?> importExcel(HttpServletRequest req, HttpServletResponse resp){
        //先把需要导入的文件上传
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) req;
        //获取上传的文件
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        //取出来
        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
            MultipartFile file = entity.getValue();// 获取上传文件对象
            ImportParams params = new ImportParams();
            params.setTitleRows(2);
            params.setHeadRows(1);
            params.setNeedSave(true);
            try {
                //上传的数据的集合(list就是文件里所有内容)
                List<VeOaCarWeizhangShiguVo> list = ExcelImportUtil.importExcel(file.getInputStream(), VeOaCarWeizhangShiguVo.class, params);
                file.getInputStream().close();
                System.out.println("================"+list.size()+"================");
                // 获取redis存的用户值
                LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
                //加入数据库使用的集合
                List<VeOaCarWeizhangShiguEntity> entityList =new ArrayList<>();
                StringBuffer sb = new StringBuffer("");
                //循环遍历把需要的字段拷贝到数据库插入的集合中
                for(VeOaCarWeizhangShiguVo v : list){
//                    System.out.println("=============================");
//                    System.out.println(v);
//                    System.out.println("=============================");
                    VeOaCarWeizhangShiguEntity veOaCarWeizhangShiguEntity = new VeOaCarWeizhangShiguEntity();
                    //查看车辆名字数据库是否存在
//                    System.out.println("v.getCarName() = "+v.getCarName());
                    VeOaCarInfoEntity veOaCarEntity = iVeOaCarWeizhangShiguService.selectCarId(v.getCarName());
//                    System.out.println("打印了这个类："+veOaCarEntity);
                    if(null == veOaCarEntity){
                        //
                        sb.append(v.getCarName());
                        sb.append(",");
                        //return Result.error("文件导入失败: 没有这辆车！" );
                    }else{
//                        System.out.println("车辆名称"+v.getCarName());
                        veOaCarWeizhangShiguEntity.setCarId(veOaCarEntity.getId());
                        veOaCarWeizhangShiguEntity.setCarName(veOaCarEntity.getCarName());
                        veOaCarWeizhangShiguEntity.setWeishiType(v.getWeishiType());
                        veOaCarWeizhangShiguEntity.setDriverUser(v.getDriverUser());
                        veOaCarWeizhangShiguEntity.setWeishiAddress(v.getWeishiAddress());
                        veOaCarWeizhangShiguEntity.setKoufenNum(v.getKoufenNum());
                        veOaCarWeizhangShiguEntity.setWeishiPrice(v.getWeishiPrice());
                        veOaCarWeizhangShiguEntity.setWeishiContent(v.getWeishiContent());
                        veOaCarWeizhangShiguEntity.setBackInfo(v.getBackInfo());
//                    veOaCarWeizhangShiguEntity.setCreateByName(v.getCreateByName());
//                    veOaCarWeizhangShiguEntity.setUpdateByName(v.getUpdateByName());
                        // 字符串转换成时间类型
                        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        veOaCarWeizhangShiguEntity.setWeishiDate(formatter.parse(v.getWeishiDate()));
//                    veOaCarWeizhangShiguEntity.setCreateTime(formatter.parse(v.getCreateTime()));
//                    veOaCarWeizhangShiguEntity.setUpdateTime(formatter.parse(v.getUpdateTime()));

                        entityList.add(veOaCarWeizhangShiguEntity);
                    }

                }
                iVeOaCarWeizhangShiguService.saveBatch(entityList);
                System.out.println(sb.toString());
                if(sb.toString().equals("")) {
                    return Result.ok("文件导入成功！数据行数：" + entityList.size());
                }else{
                    return Result.OK("文件导入成功！数据行数：" + entityList.size()+",导入失败的车辆："+sb.toString());
                }
            } catch (Exception e) {
                return Result.error("文件导入失败:" + e.getMessage());
            } finally {
//                try {
////                    file.getInputStream().close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
            }
        }
        return null;
    }

    //单个导入
    @AutoLog(value = "车辆加违章事故记录-导入")
    @ApiOperation(value = "车辆加违章事故记录导入", notes = "车辆加违章事故记录导入")
    @PostMapping(value = "/importExcelOne")
    public Result<?> importExcelOne(HttpServletRequest req, HttpServletResponse resp){
        // 判断这辆车的导入
        VeOaCarInfoTableVo carInfo = (VeOaCarInfoTableVo) redisUtil.get("carInfo");
        //先把需要导入的文件上传
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) req;
        //获取上传的文件
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        //取出来
        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
            MultipartFile file = entity.getValue();// 获取上传文件对象
            ImportParams params = new ImportParams();
            params.setTitleRows(2);
            params.setHeadRows(1);
            params.setNeedSave(true);
            try {
                //上传的数据的集合(list就是文件里所有内容)
                List<VeOaCarWeizhangShiguVo> list = ExcelImportUtil.importExcel(file.getInputStream(), VeOaCarWeizhangShiguVo.class, params);
                file.getInputStream().close();
                System.out.println("================"+list.size()+"================");
                // 获取redis存的用户值
                LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
                //加入数据库使用的集合
                List<VeOaCarWeizhangShiguEntity> entityList =new ArrayList<>();
                StringBuffer sb = new StringBuffer("");
                //循环遍历把需要的字段拷贝到数据库插入的集合中
                for(VeOaCarWeizhangShiguVo v : list){

//                    System.out.println("=============================");
//                    System.out.println(v);
//                    System.out.println("=============================");
                    VeOaCarWeizhangShiguEntity veOaCarWeizhangShiguEntity = new VeOaCarWeizhangShiguEntity();
                    //查看车辆名字数据库是否存在
//                    System.out.println("v.getCarName() = "+v.getCarName());
                    VeOaCarInfoEntity veOaCarEntity = iVeOaCarWeizhangShiguService.selectCarId(v.getCarName());



//                    System.out.println("打印了这个类："+veOaCarEntity);
                    if(null == veOaCarEntity && carInfo.getId() != v.getCarId()){
                        //
                        sb.append(v.getCarName());
                        sb.append(",");
                        //return Result.error("文件导入失败: 没有这辆车！" );
                    }else{

//                        System.out.println("车辆名称"+v.getCarName());
                        veOaCarWeizhangShiguEntity.setCarId(veOaCarEntity.getId());
                        veOaCarWeizhangShiguEntity.setCarName(veOaCarEntity.getCarName());
                        veOaCarWeizhangShiguEntity.setWeishiType(v.getWeishiType());
                        veOaCarWeizhangShiguEntity.setDriverUser(v.getDriverUser());
                        veOaCarWeizhangShiguEntity.setWeishiAddress(v.getWeishiAddress());
                        veOaCarWeizhangShiguEntity.setKoufenNum(v.getKoufenNum());
                        veOaCarWeizhangShiguEntity.setWeishiPrice(v.getWeishiPrice());
                        veOaCarWeizhangShiguEntity.setWeishiContent(v.getWeishiContent());
                        veOaCarWeizhangShiguEntity.setBackInfo(v.getBackInfo());
//                    veOaCarWeizhangShiguEntity.setCreateByName(v.getCreateByName());
//                    veOaCarWeizhangShiguEntity.setUpdateByName(v.getUpdateByName());
                        // 字符串转换成时间类型
                        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        veOaCarWeizhangShiguEntity.setWeishiDate(formatter.parse(v.getWeishiDate()));
//                    veOaCarWeizhangShiguEntity.setCreateTime(formatter.parse(v.getCreateTime()));
//                    veOaCarWeizhangShiguEntity.setUpdateTime(formatter.parse(v.getUpdateTime()));

                        entityList.add(veOaCarWeizhangShiguEntity);
                    }

                }
                iVeOaCarWeizhangShiguService.saveBatch(entityList);
                System.out.println(sb.toString());
                if(sb.toString().equals("")) {
                    return Result.ok("文件导入成功！数据行数：" + entityList.size());
                }else{
                    return Result.ok("文件导入成功！数据行数：" + entityList.size()+",导入失败的车辆："+sb.toString());
                }
            } catch (Exception e) {
                return Result.error("文件导入失败:" + e.getMessage());
            } finally {
//                try {
////                    file.getInputStream().close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
            }
        }
        return null;
    }

    //修改
    @AutoLog(value = "车辆加违章事故记录-修改")
    @ApiOperation(value = "车辆加违章事故记录修改", notes = "车辆加违章事故记录修改")
    @PostMapping(value = "/setCarTable")
    public Result<?>setTable(VeOaCarWeizhangShiguEntity veOaCarWeizhangShiguEntity,String date) throws ParseException{
        // 前端传过来的时间字符串转换成日期
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date sTime= null;
        sTime = formatter.parse(date.trim());
        veOaCarWeizhangShiguEntity.setWeishiDate(sTime);
        //获取登陆人的信息
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        veOaCarWeizhangShiguEntity.setUpdateBy(user.getId());
        veOaCarWeizhangShiguEntity.setUpdateByName(user.getRealname());

        int res = iVeOaCarWeizhangShiguService.setweizhangShigu(veOaCarWeizhangShiguEntity);
        if(res==0){
            return Result.error(500,"修改失败");
        }
        return Result.ok();
    }

    // 高级搜索
    @AutoLog(value = "车辆违章事故记录-高级搜索")
    @ApiOperation(value="高级搜索", notes="车辆违章事故记录-高级搜索")
    @PostMapping(value = "/advancedQuery")
    public Result advancedQuery(@RequestBody String queryArray) {
        Map<String, List<QueryCondition>> maps = (Map<String, List<QueryCondition>>) JSON.parse(queryArray);
        List<QueryCondition> list=new ArrayList<QueryCondition>(JSONArray.parseArray(maps.get("queryArray").toString(),QueryCondition.class));
        String  conditionStr =  QueryConditionTool.getQueryConditionTool().advancedQuery(list);
        HashMap<String , Object>  map=null;
            map= iVeOaCarWeizhangShiguService.advancedQuery(conditionStr);


        return  Result.OK(map);
    }

    @AutoLog(value = "车辆违章事故记录-模板地址获取")
    @ApiOperation(value = "模板地址", notes = "车辆违章事故记录-模板地址获取")
    @PostMapping(value = "/getUrl")
    public Result<T> getUrl() throws Exception {
        Result result = new Result();
        String url= OssDownloadUtil.getOssDownloadUtil().downFileFromOSS("车辆违章模板.xls");
        result.success(url);
        return result;
    }
}
